AppManifestモジュールについて
概要
アプリケーションの設定ファイルを読み書きする機構。
Autoyaのモジュールの一つ。
https://github.com/sassembla/Autoya/tree/master/Assets/Autoya/Manifest
重要な制約として、string以外の型を保持できないようにしてある。
サンプル
https://github.com/sassembla/Autoya/blob/master/Assets/AutoyaSample/10_AppManifest/AppManifest.unity
おまけで、UnityCloudBuild上でビルドした場合、
CloudBuildのパラメータも取り込んだ情報を取得できるようにしてある。(もしかしたら動いてないかも)
あとshellからビルドメッセージを入れたりできる。
用途
アプリケーションの運用に際して、事前に定義したパラメータを管理するのに特化している。
アプリケーションの運用以外に関するパラメータを管理するために使うのは得策では無い。
アプリケーションで保持、管理したいパラメータ
1.ビルド時に決定されるreadonlyなパラメータ
2.ビルド時に初期値が決定され、更新されるパラメータ
3.動作時に新規に追加、上書きされていくパラメータ
だいたいこの三つがあると思う。
AppManifest機構では、1と2を扱う。3はInAppDBなどで扱う。
1.ビルド時に決定されるreadonlyなパラメータ
アプリケーションのバージョン、ビルド時の情報など、
外部から参照して使うのみのパラメータ。
よくタイトル画面に表示したりする。
パラメータ名から値までが完全に決定された状態。
2.ビルド時に初期値として決定され、それ以降更新されるパラメータ
事前にキーが決まっているパラメータ。
外部から参照して使うほか、更新が発生したりする。
事前にキーが決まっており、深度も決定されているが、変更が発生することがあるのが1との違い。
予期されている範囲での変動を保持する。
3.動作時に新規に追加、上書きされていくパラメータ
1,2以外のクライアント側でのpersistantな要素。
要はDB。
キーが増えたり、深度が変わったりする。初期値もあったりなかったり。
真面目な運用を考えるとまあ可変キー、可変深度になると思う。
型も多岐にわたる。
AppManifest
次のような階層構造になっている
AppManifestStore
┣ BuildManifest
ビルド時に決定されるパラメータ集
┗ RuntimeManifest
ビルド時に初期値として決定され、それ以降更新されるパラメータ集
で、
取り出しはAppManifestStore経由で、辞書形式で取得できるようになっている。
RuntimeManifestパラメータに関しては、取り出し -> 変更 -> 上書き、ができる。
read/writeに関する機構は外部から渡すことができる(暗号化/復号化フック書ける)
BuildManifest、RuntimeManifestに使用するデータ型は外部から渡す。
それぞれの保存形式
BuildManifest
実行時書き換え機構を持たないため、まんまResourcesフォルダ以下にjson形式で保存されている。
RuntimeManifest
実行時書き換え機構を持つため、アプリケーションの実行環境に保存される。
保存メソッドは外部から与えることができる。
両方とも、生成元となる型を与えて生成するデータの形状を規定する。
生成元の型情報に初期値をセットすることができる。
重要な制約として、string以外の型を保持できない。
Autoyaでの使用例
Autoyaでは、2つのバージョン値を使ってユーザーの手元のゲームを管理できるようになっている。
appVersion
アプリケーションのバージョン
resVersion
リソースのバージョン
appVersion
appVersionはアプリケーションの実行バイナリの更新でのみ変動するため、
BuildManifestのパタメータとして保持している。
認証がある通信に際して、サーバ側にクライアントアプリのバージョンを通知するために使っている。
サーバはこの通知をもとに、「君のアプリは古い。こっちを使いなさい」とか返答を寄越してくる。
resVersion
resVersionはアプリケーションが現在保持しているDL可能リソース全体のバージョンを表象している。
これはアプリの運用中に変化していく(だいたいincrementされる)ため、
RuntimeManifestのパラメータとして保持している。
認証がある通信に際して、サーバ側にクライアントのDL済みのリソースバージョンを通知するために使っている。
サーバはこの通知をもとに、「君のアプリのリソース情報は古い。こっちを使いなさい」とか返答を寄越してくる。